#!/usr/bin/python
# -*- coding: UTF8 -*-
# archivo : bosque.py 
#
###############################################################################
#
#
# Eco-Py - Juego educativo, ayudando a preservar el medioambiente
# Copyright (c) 2010 Javier Castrillo // riverplatense at gmail dot com
# Este programa es software libre; usted puede redistruirlo y/o modificarlo bajo
# los términos de la Licencia Pública General GNU, tal y como está publicada
# por la Free Software Foundation; ya sea la versión 2 de la Licencia, o (a su
# elección) cualquier versión posterior.
#
# Este programa se distribuye con la intención de ser útil, pero SIN NINGUNA
# GARANTÍA; incluso sin la garantía implícita de USABILIDAD O UTILIDAD PARA UN
# FIN PARTICULAR. Vea la Licencia Pública General GNU para más detalles.
#
# Usted debería haber recibido una copia de la Licencia Pública General GNU
# junto a este programa; si no es así, escriba a la Free Software Foundation,
# Inc. 675 Mass Ave, Cambridge, MA 02139, EEUU.
#
#
###############################################################################


# Mòdulos

import pygame
from pygame.locals import *
from pygame.sprite import Group 
import random
import sys
from math import *

#Inicializamos pygame y sonido
#pygame.mixer.pre_init(44100, -16, False)
pygame.init()

#Constantes
# medidas de la ventana del juego

ANCHO = 800
ALTO = 550

#MUSICA = pygame.mixer.Sound("sonidos/je.wav")

#Clases
# Aqui se colocan las clases
class Personaje(pygame.sprite.Sprite):
    """Crea el personaje y le otorga movimiento"""
    def __init__(self):
        """Inicio de la clase personaje"""
        pygame.sprite.Sprite.__init__(self)
        self.image  = imagen("images/pp_14.png", True)
        self.rect = self.image.get_rect()
        self.rect.centerx= 50.
        self.rect.centery= 510.
        self.speed = 0.2
        
    def mover(self, time, keys):
        """Le doy movimiento al personaje y la animacion"""
        if self.rect.top >= 0:
            if keys[K_UP]:
                n = random.randint(2, 3)#2 y 3 son las imagenes y el orden en que se 
                    #muestran para animar al personaje
                self.image = imagen('images/pp_%d.png'%n, True)
                self.rect.centery -= self.speed * time
                
        if self.rect.bottom <= ALTO:
            if keys[K_DOWN]:
                a = random.randint(0, 1)
                self.image = imagen('images/pp_%d.png'%a, True)
                self.rect.centery += self.speed * time
                
        #indico al personaje que cuando llegue a 0 px de 'x' reaparezca en 800px
        if keys[K_LEFT]:
            self.rect.centerx -= self.speed * time
            l = random.randint(4, 5)
            self.image = imagen('images/pp_%d.png'%l, True)
            if self.rect.left < 0:
                self.rect.left = ANCHO
                self.rect.centerx -= self.speed * time
                
        #indico al personaje que cuando llegue a 800 px de 'x' reaparezca en 0px
        if keys[K_RIGHT]:
            self.rect.centerx += self.speed * time
            r = random.randint(6, 7)
            self.image = imagen('images/pp_%d.png'%r, True)
            if self.rect.right > ANCHO:
                self.rect.right = 0
                self.rect.centerx -= self.speed * time
        
        
class Arbol (pygame.sprite.Sprite):
    """Crea el fondo de arboles???"""
    def __init__ (self, x , y):
        """Inicio de la clase arbol"""
        x = x
        y= y
        pygame.sprite.Sprite.__init__(self)
        self.image = imagen("images/arbol.png", True)
        self.rect = self.image.get_rect()             
        self.rect.centerx = x
        self.rect.centery = y
                
class Topadora (pygame.sprite.Sprite):
    """Crea el destructor del bosque"""
    def __init__(self):
        """Inicio de la clase topadora"""
        pygame.sprite.Sprite.__init__(self)
        self.image = imagen("images/topadora.png", True)
        self.rect = self.image.get_rect()
        self.rect.centerx= 170.
        self.rect.centery= 150.
        self.speed = [0]

    def colision(self, personaje, puntos, time, keys):
        """Creo la colisión, le doy puntaje y voy a siguiente pantalla de seguir jugando"""
        # copiado fabrica 
        self.rect.centerx += self.speed[0] * time 
        if pygame.sprite.collide_rect(self, personaje):
            puntos[0] += 1000
            personaje.speed == 0
            if self.rect.left <= 250 :
                self.speed[0] = 0.2
                print self.speed
            
                


#9.11       MUSICA.stop()
        else:
            if keys [K_RIGHT] and pygame.sprite.collide_rect(self, personaje):
                personaje.rect.right -= personaje.speed * time
        return  
            

class Troncos (pygame.sprite.Sprite):
    """Utilizado para darle vida a los troncos"""
    def __init__ (self, x ,y):
        """Inicio de la clase troncos"""
        x = x
        y = y
        pygame.sprite.Sprite.__init__(self)
        self.image = imagen("images/tronco2.png", True)
        self.rect= self.image.get_rect()
        self.rect=self.image.get_rect()
        self.rect.centerx= x
        self.rect.centery= y

class Clima (pygame.sprite.Sprite):
    """Se crean las nubes de tormenta y se le da movimiento"""
    def __init__(self, x, y):
        x = x
        y = y
        pygame.sprite.Sprite.__init__(self)
        self.image = imagen("images/nube.png", True)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y
        self.speed = [0.3,-0.3]
        
    def ia(self, time, personaje):
        """Creo la inteligencia artificial que mueve las nubes en la pantalla"""
        self.rect.centerx += self.speed[0] * time 
        if self.rect.left <= 10 or self.rect.right >= ANCHO:
            self.speed[0] = -self.speed[0]
        """Creo la colisión entre las nubes y el personaje. Si se tocan termina el juego"""
        # COPIADO DE FABRICA.py, XD
        f = open('nube', 'w')
        f.write('0')
        f.close()
        
        f = open('nube', 'r')
        estado = f.readline()
        estado.strip()
        f.close()
        if estado == '0':
            if pygame.sprite.collide_rect(self, personaje):
                self.speed = [0, 0]
                f =open('cargado', 'w')
                f.write('1')
                f.close()
                #MUSICA.stop()
                #dirige al menu de opciones
                import reiniciar
                reiniciar.main ()
        else:
            self.rect.centerx = 1000
        return
            
            
            
        
class Semillas (pygame.sprite.Sprite):
    def __init__ (self,x , y):
        x = x
        y = y
        pygame.sprite.Sprite.__init__(self)
        self.image = imagen("images/semillas.png",True)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y
    def colision (self, personaje, puntos):
        if pygame.sprite.collide_rect(self,personaje):
            self.rect.centerx = 900
            puntos [0] += 100
            return puntos
            
class Paisaje (pygame.sprite.Sprite):
    def __init__ (self, x, y):
        x = x 
        y = y
        pygame.sprite.Sprite.__init__(self)
        self.image= imagen("images/paisaje.png",True)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y
            
class Horiz(pygame.sprite.Sprite):
    """Inicializo la clase, doy argumentos, y creo variables para posición"""
    def __init__(self, x, y):
        x = x
        y = y
        pygame.sprite.Sprite.__init__(self)
        self.image = imagen('images/peldanio.png', True)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
    
    def colision(self, personaje, time, keys):
        """Creacion de la colisión"""
        if keys[K_UP] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.top += personaje.speed * time 
            
        elif keys[K_DOWN] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.bottom -= personaje.speed * time 
            
        elif keys[K_LEFT] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.left += personaje.speed * time
        
        elif keys[K_RIGHT] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.right -= personaje.speed * time
    
class Vertical(pygame.sprite.Sprite):
    """Inicializo la clase, doy argumentos, y creo variables para posición"""
    def __init__(self, x, y):
        x = x
        y = y
        pygame.sprite.Sprite.__init__(self)
        self.image = imagen('images/peldaniovert.png', True)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

    def colision(self, personaje, time, keys):
        """Creo la colision. Le resto puntaje"""
        if keys [K_LEFT] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.left += personaje.speed * time
            
        elif keys [K_RIGHT] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.right -= personaje.speed * time


#funciones
# lo usamos para cargar las imagenes que utilizamos en el juego
def imagen (archivo, transparent= False):
    """Cargador de imagenes de todo el juego"""
    try:
    # variable que carga la imagen
        pic = pygame.image.load(archivo)
        
    except pygame.error, message:
       raise SystemExit, message
    
    pic = pic.convert()
    # habilita la transparencia de la imagen tomando el punto(pixel) "0,0" 
    if transparent:
        color = pic.get_at((0,0))
        pic.set_colorkey(color,RLEACCEL)
        
    return pic
# funcion principal del juego



def texto(texto, posx, posy, color=(255, 0, 0)):
    """ La utilizo para cargar la fuente del texto, tamaño y color"""
    fuente = pygame.font.Font('fonts/karnivor.ttf', 25)
    salida = pygame.font.Font.render(fuente, texto, 1, color)
    salida_rect = salida.get_rect()
    salida_rect.centerx = posx
    salida_rect.centery = posy



    return salida, salida_rect  


def main():
    """Inicio del juego"""
    # crea la ventana 
    #MUSICA.play()
    pantalla = pygame.display.set_mode((ANCHO,ALTO))
    pygame.display.set_caption("Eco-py")
    clock = pygame.time.Clock()
    fondo = imagen("images/bosquejo.jpg")
    
    # Llamomos a las clases 

    personaje = Personaje()
    topadora= Topadora()
    # Creamos grupos y sus sprites correspondientes
    tronco1= Troncos(200,521)
    tronco2= Troncos(150,521)
    tronco3= Troncos(175,481)
    troncos = Group()
    troncos.add([tronco1, tronco2, tronco3])    
    ph1 = Horiz(0, 400)
    ph2 = Horiz(180, 450)
    ph3 = Horiz(320, 400)
    ph4 = Horiz(0, 180)
    ph5 = Horiz(180, 180)
    ph6 = Horiz(300, 180)
    ph7 = Horiz(150, 290)
    ph8 = Horiz(500, 290)
    ph9 = Horiz(550, 290) 
    ph10 = Horiz(600, 300)
    ph11 = Horiz(150, 300)
    ph12 = Horiz(500, 300)
    ph13 = Horiz(550, 300)
    ph14 = Horiz(1, 540)
    ph15 = Horiz(200, 540)
    ph16 = Horiz(350, 540)
    ph17 = Horiz(550, 540)
    ph = Group()
    ph.add([ph1, ph2, ph3, ph4, ph5, ph6, ph7, ph8, ph9, ph10, ph11, ph12, ph13, ph14, ph15, ph16, ph17])
    pv1 = Vertical(0, 180)
    pv2 = Vertical(0, 180)
    pv3 = Vertical(780, 180)
    pv4 = Vertical(0, 280)
    pv5 = Vertical(0, 280)
    pv6 = Vertical(780, 450)
    pv7 = Vertical(780, 360)
    pv8 = Vertical(0, 360)
    pv9 = Vertical(0, 450)
    gvert = Group()
    gvert.add([pv1,pv2,pv3,pv4,pv5,pv6,pv7,pv8,pv9])
    # --------------------
    topa= Topadora()
    
    pers = Group()
    pers.add(personaje)
    # peldanios 
    bosque = Arbol(0,65)
    bosque1 = Arbol(50,65)
    bosque2 = Arbol(20,65)
    bosque3 = Arbol(80,65)
    
    nube = Clima (200, 230)
    nubes = Clima (600,350)
    
    semilla1 = Semillas (750, 450)
    semilla2 = Semillas (400, 150)
    semilla3 = Semillas (40, 360)
    semilla4 = Semillas (750, 250)
    semilla5 = Semillas (270, 410)
    semilla6 = Semillas (200, 250)
    semilla7 = Semillas (150, 515)
    
    paisaje = Paisaje(680,35)
    paisaje2 = Paisaje(580,35)
    
    puntos = [0] 

    
    
    # Bucle infinito para que la ventana se muestre constantemente
    while True:
        time= clock.tick(60)
        keys = pygame.key.get_pressed()
        # enventos del jgame.reset() guego
        for eventos in pygame.event.get():
            if eventos.type == QUIT:
                sys.exit(0)
        
        p, p_rect = texto(str(puntos[0]), ANCHO/4, 40)
        
        personaje.mover(time,keys)
                
        pantalla.blit(fondo,(0,0))
        
        
        
        pantalla.blit(semilla1.image, semilla1.rect)
        pantalla.blit(semilla2.image, semilla2.rect)
        pantalla.blit(semilla3.image, semilla3.rect)
        pantalla.blit(semilla4.image, semilla4.rect)
        pantalla.blit(paisaje.image, paisaje.rect)
        pantalla.blit(paisaje2.image, paisaje2.rect)
        pantalla.blit(topa.image, topa.rect)
        pantalla.blit(personaje.image, personaje.rect)
        pantalla.blit(semilla1.image, semilla1.rect)
        pantalla.blit(semilla2.image, semilla2.rect)
        pantalla.blit(semilla3.image, semilla3.rect)
        pantalla.blit(semilla4.image, semilla4.rect)
        pantalla.blit(semilla5.image, semilla5.rect)
        pantalla.blit(semilla6.image, semilla6.rect)
        pantalla.blit(semilla7.image, semilla7.rect)
        pantalla.blit(bosque.image, bosque.rect)
        pantalla.blit(bosque1.image, bosque1.rect)
        pantalla.blit(bosque2.image, bosque2.rect)
        pantalla.blit(bosque3.image, bosque3.rect)
        pantalla.blit(p, p_rect)
        pantalla.blit(nube.image, nube.rect)
        pantalla.blit(nubes.image, nubes.rect)

        
        Group.draw(ph, pantalla)
        Group.draw(gvert, pantalla)

                
        ph1.colision(personaje,  time, keys)
        ph2.colision(personaje,  time, keys)
        ph3.colision(personaje,  time, keys)
        ph4.colision(personaje,  time, keys)
        ph5.colision(personaje,  time, keys)
        ph6.colision(personaje,  time, keys)
        ph7.colision(personaje,  time, keys)
        ph8.colision(personaje,  time, keys)
        ph9.colision(personaje,  time, keys)
        ph10.colision(personaje, time, keys)
        ph11.colision(personaje, time, keys)
        ph12.colision(personaje, time, keys)
        ph13.colision(personaje, time, keys)
        ph14.colision(personaje, time, keys)
        ph15.colision(personaje, time, keys)
        ph16.colision(personaje, time, keys)
        ph17.colision(personaje, time, keys)
        pv1.colision(personaje,  time, keys)
        pv2.colision(personaje,  time, keys)
        pv3.colision(personaje,  time, keys)
        pv4.colision(personaje,  time, keys)
        pv5.colision(personaje,  time, keys)
        pv6.colision(personaje,  time, keys)
        pv7.colision(personaje,  time, keys)
        pv8.colision(personaje,  time, keys)
        pv9.colision(personaje,  time, keys)
        topa.colision(personaje, puntos, time, keys)
        semilla1.colision(personaje, puntos)
        semilla2.colision(personaje, puntos)
        semilla3.colision(personaje, puntos)
        semilla4.colision(personaje, puntos)
        semilla5.colision(personaje, puntos)
        semilla6.colision(personaje, puntos)
        semilla7.colision(personaje, puntos)


        
        nube.ia(time,personaje)
        nubes.ia(time,personaje)

        pygame.display.update()
        pygame.display.flip()        
        #MUSICA.stop()
    return 0
    
    
# inicio del juego 
if __name__ == "__main__":
    pygame.init()
    #pygame.mixer.init()
    main()

